# Go service

## ТЗ

#------ Сервис

Создать сервис на языке go для тестирования мониторинга и сбора логов.

Сервис имеет ручки:

- GET `/health` - выдает информацию Ready и Версию
- GET `/resources` - пишет лог о том, что был вызван метод get
- PUT `/resources` - пишет лог о том, что был вызван метод put
- POST `/resources` - пишет лог о том, что был вызван метод post
- PATCH `/resources` - пишет лог о том, что был вызван метод patch
- DELETE `/resources` - пишет лог о том, что был вызван метод delete
- GET `/metrics` - метрики сервиса в формате Prometheus

Сервис пишет логи в файл ./logs/go_service_logs.log

Сервис пишет логи в формате:

```log
2017-12-17T18:54:16.241-0500	INFO	logp/core_test.go:13	unnamed global logger
2017-12-17T18:54:16.242-0500	INFO	[example]	logp/core_test.go:16	some message
2017-12-17T18:54:16.242-0500	INFO	[example]	logp/core_test.go:19	some message	{"x": 1}
```

#------ Прокси

Перед сервисом работает envoy proxy, который также отдает метрики и пишет логи.

Задача прокси - обеспечить проксирование http трафика до сервиса.

Соотвественно продублировать ручки:

- GET `/api/health` - выдает информацию Ready и Версию
- GET `/api/resources` - пишет лог о том, что был вызван метод get
- PUT `/api/resources` - пишет лог о том, что был вызван метод put
- POST `/api/resources` - пишет лог о том, что был вызван метод post
- PATCH `/api/resources` - пишет лог о том, что был вызван метод patch
- DELETE `/api/resources` - пишет лог о том, что был вызван метод delete
- GET `/prometheus/metrics` - метрики сервиса в формате Prometheus

Но сделать перезапись - в оригинале трафик приходит на прокси с префиксом `/api/`.

## Задачи

- Сделать перезапись `/api/` на `/` на envoy proxy; (+)
- Сделать получение метрик по /prometheus/metrics;
- Запретить получать метрики по `/api/metrics`;
- Изменить формат логов сервиса go;
- Найти готовый сервис на go;

## Особенности работы с go

'go get' is no longer supported outside a module.
To build and install a command, use 'go install' with a version,
like 'go install example.com/cmd@latest'
For more information, see https://golang.org/doc/go-get-install-deprecation
or run 'go help get' or 'go help install'.

```shell
go mod init main
```
Далее
```go
package main
```

```shell
go run main.go
```

## Insomnia

Создал коллекцию для тестирования

## WSL

Не получается отправлять запросы с wsl ubuntu на localhost windows.

## Envoy Proxy

```shell
docker run --rm  envoyproxy/envoy:dev-a27e45192271380465f3a44cffe3214cfae3c0bd --version
```

```shell
docker run --rm -it -p 9901:9901 -p 10000:10000 envoyproxy/envoy:dev-a27e45192271380465f3a44cffe3214cfae3c0bd
```

**Using git bash**
https://stackoverflow.com/questions/7250130/how-to-stop-mingw-and-msys-from-mangling-path-names-given-at-the-command-line#34386471
```shell
export MSYS_NO_PATHCONV=1
MSYS_NO_PATHCONV=1 docker run --rm -it \
      -v $(pwd)/envoy/envoy-http-proxy.yaml:/envoy-http-proxy.yaml \
      -p 9901:9901 \
      -p 10000:10000 \
      -p 10001:10001 \
      -p 10002:10002 \
      envoyproxy/envoy:dev-a27e45192271380465f3a44cffe3214cfae3c0bd \
          -c /envoy-http-proxy.yaml
```

```shell
MSYS_NO_PATHCONV=1 docker run --rm \
      -v $(pwd)/envoyenvoy-http-proxy.yaml:/envoy-http-proxy.yaml \
      envoyproxy/envoy:dev-a27e45192271380465f3a44cffe3214cfae3c0bd \
          --mode validate \
          -c /envoy-http-proxy.yaml
```

> Use `host.docker.internal` to connect to windows localhost from docker.

Почему так?
> Error: terminal filter named envoy.filters.network.http_connection_manager of type envoy.filters.network.http_connection_manager must be the last filter in a network filter chain.

"type.googleapis.com/envoy.extensions.filters.network.direct_response.v3.Config"
https://qiita.com/DaichiSasak1/items/1fb781e5dd2fa549ac48
